unit repuestos;
interface
uses declaraciones,archivos,Dos,crt,sysutils;

procedure MenuFaltanteRepuestos(var faltantes : tPunFaltantes; var noReparados : tPunNoReparado);
{Inicializa los vectores}
procedure InicializarArreglos(var faltantes : tPunFaltantes; var noReparados : tPunNoReparado);
procedure ImprimirRepuestosFaltantes(faltantes : tPunFaltantes);
procedure ImprimirPedidosNoReparados(noReparados: tPunNoReparado);
{Agrega un nuevo repuesto faltante al vector de repuestos faltantes}
procedure AgregarRepuesto(var faltantes : tPunFaltantes;codRepu,nroPedido,cantidad:word);
{Agrega un nuevo pedido al vector de pedidos no reparados por falta de repuestos}
procedure AgregarPedido(var noReparados : tPunNoReparado;codRepu,nroPedido,cantidad:word);
{Carga en memoria dinamica los arreglos de faltantes de repuestos y de pedidos no reparados}
procedure CargarFaltanteRepuestos(var noReparado:TReparacion;var Faltantes:tPunFaltantes;var NoReparados:tPunNoReparado);
{Actualiza los faltantes de repuestos luego de registrar una reparacion exitosamente}
procedure ActualizarFaltanteRepuestos(var faltantes : tPunFaltantes; var reparado:TReparacion);

implementation
	procedure MenuFaltanteRepuestos(var faltantes:tPunFaltantes;var noReparados:tPunNoReparado);
	var
	opcion:char;
	begin
		repeat
			clrscr;
			gotoxy(4,4);
			Writeln(TXT_TIT_FALTANTE_REPUESTOS);
			gotoxy(8,6);
			Writeln(TXT_A_FALTANTE_REPUESTOS);
			gotoxy(8,8);
			Writeln(TXT_B_FALTANTE_REPUESTOS);
			gotoxy(8,10);
			Writeln(TXT_VOLVER_PPAL);
			gotoxy(2,24);
			{$I-}
			opcion:=readkey;
			{$I+}
			if (uppercase(opcion) = OPCION_1) then
			begin
			
				clrscr;
				gotoxy(4,4);
				Writeln(TXT_TIT_FALTANTE_REPUESTOS);
				gotoxy(8,6);
				Writeln(TXT_A_FALTANTE_REPUESTOS);
				gotoxy(8,8);
				ImprimirRepuestosFaltantes(faltantes);
			end	else begin
				if (uppercase(opcion) = OPCION_2) then begin
					clrscr;
					gotoxy(4,4);
					Writeln(TXT_TIT_FALTANTE_REPUESTOS);
					gotoxy(8,6);
					Writeln(TXT_B_FALTANTE_REPUESTOS);
					gotoxy(8,8);
					ImprimirPedidosNoReparados(noReparados);
				end;
			end;
		until (IOResult = 0) and (opcion = OPCION_SALIR);
	end;

procedure ImprimirRepuestosFaltantes(faltantes : tPunFaltantes);
var
contador:word;
cantFaltantes:word;
repFaltantes:tPunFaltantes;
noReparados:tPunNoReparados;
opcion:char;
begin
	if (faltantes = nil) then
	begin
		clrscr;
		gotoxy(4,4);
		Writeln('No hay repuesto faltantes registrados');
		gotoxy(4,10);
		Writeln(TXT_CUALQUIER_TECLA);
		{$I-}
		opcion:=readkey;
		{$I+}
	end else begin
		contador := 0;
		repFaltantes:=faltantes;
		clrscr;
		repeat
			noReparados:=repFaltantes^.arrNoReparados;
			Writeln('Repuesto codigo: ' + WToStr(repFaltantes^.codRepu) + '  cantidad: ' + WToStr(repFaltantes^.cantidad));
			Writeln('Pedidos no reparados por falta de este repuesto: ');
			repeat
				Writeln(#9 + 'Pedido nro: ' + WToStr(noReparados^.codPedido));
				noReparados := noReparados^.sig;
			until noReparados = nil;
		repFaltantes:=repFaltantes^.sig;
		until repFaltantes = nil;
		Writeln(TXT_CUALQUIER_TECLA);
		{$I-}
		opcion:=readkey;
		{$I+}
	end;
end;

procedure ImprimirPedidosNoReparados(noReparados: tPunNoReparado);
var
contador:word;
repuestos:tPunRepFaltantes;
tmpNoReparados:tPunNoReparado;
opcion:char;
begin
	if (noReparados=nil) then
	begin
		clrscr;
		gotoxy(4,4);
		Writeln('No hay pedidos no reparados registrados');
		gotoxy(4,10);
		Writeln(TXT_CUALQUIER_TECLA);
		{$I-}
		opcion:=readkey;
		{$I+}
	end else begin
		tmpNoReparados:=noReparados;
		clrscr;
		repeat
			writeln('Pedido nro: ' + WToStr(tmpNoReparados^.codPedido) + ' no reparado por:');
			repuestos:=tmpNoReparados^.arrRepFaltantes;
			repeat
				writeln(#9 + 'Repuesto codigo: ' + WToStr(repuestos^.codRepuesto) + ' catidad: ' + WToStr(repuestos^.cant));
				repuestos:=repuestos^.sig;
			until repuestos = nil;
			tmpNoReparados:=tmpNoReparados^.sig;
		until tmpNoReparados=nil;
		Writeln(TXT_CUALQUIER_TECLA);
		{$I-}
		opcion:=readkey;
		{$I+}
	end;
end;

procedure InicializarArreglos(var faltantes:tPunFaltantes;var noReparados:tPunNoReparado);
begin
	Faltantes:=nil;
	NoReparados:=nil;
end;
procedure CargarFaltanteRepuestos(var noReparado:TReparacion;var Faltantes:tPunFaltantes;var NoReparados:tPunNoReparado);
var
i,codRepu,cantidad,nroPedido:word;
begin
	for i:=1 to MAX_REPUESTOS do
	begin
		if (noReparado.repuestos[i].codigo <> 0) and (noReparado.repuestos[i].faltantes <>0) then
		begin
			nroPedido	:=noReparado.numero;
			codRepu		:=noReparado.repuestos[i].codigo;
			cantidad	:=noReparado.repuestos[i].faltantes;
			
			AgregarRepuesto(Faltantes,codRepu,nroPedido,cantidad);
			AgregarPedido(NoReparados,codRepu,nroPedido,cantidad);
		end;
	end;
end;

procedure AgregarRepuesto(var faltantes : tPunFaltantes;codRepu,nroPedido,cantidad:word);
var
p,q,nuevo:tPunFaltantes;
r:tPunNoReparados;
begin
	p:=faltantes;
	while ((p<>nil) and (p^.codrepu<codRepu)) do
	begin
		q:=p;
		p:=p^.sig;
	end;
	{Si el codigo de repouesto ya existe en el arreglo}
	if ((p<>nil) and (p^.codrepu=codRepu)) then
	begin
		new(r);
		r^.codPedido:=nroPedido;
		r^.sig:=p^.arrNoReparados;
		p^.arrNoReparados:=r;
		p^.cantidad:=p^.cantidad+cantidad;
	end;
	{Si se llega al final de la lista o la posicion deseada}
	if ((p=nil) or (p^.codrepu>codRepu))then
	begin
		new(nuevo);
		new(r);
		if(p=faltantes)then
		begin
			faltantes:=nuevo;
		end else begin
			q^.sig:=nuevo;
		end;
		nuevo^.sig:=p;
		nuevo^.codrepu:=codRepu;
		p:=nuevo;
		r^.codPedido:=nroPedido;
		r^.sig:=nil;
		p^.arrNoReparados:=r;
		p^.cantidad:=cantidad;
	end;
end;

procedure AgregarPedido(var noReparados : tPunNoReparado;codRepu,nroPedido,cantidad:word);
var
p,q,nuevo:tPunNoReparado;
r:tPunRepFaltantes;
begin
	p:=noReparados;
	while ((p<>nil) and (p^.codPedido<nroPedido)) do
	begin
		q:=p;
		p:=p^.sig;
	end;
	{Si el codigo de pedido ya existe en el arreglo}
	if ((p<>nil) and (p^.codPedido=nroPedido)) then
	begin
		new(r);
		r^.codRepuesto:=codRepu;
		r^.cant:=cantidad;
		r^.sig:=p^.arrRepFaltantes;
		p^.arrRepFaltantes:=r;
	end;
	{Si se llega al final de la lista o la posicion deseada}
	if ((p=nil) or (p^.codPedido>nroPedido))then
	begin
		new(nuevo);
		new(r);
		if(p=noReparados)then
		begin
			noReparados:=nuevo;
		end else begin
			q^.sig:=nuevo;
		end;
		nuevo^.sig:=p;
		nuevo^.codPedido:=nroPedido;
		p:=nuevo;
		r^.codRepuesto:=codRepu;
		r^.cant:=cantidad;
		r^.sig:=nil;
		p^.arrRepFaltantes:=r;
	end;
end;
procedure ActualizarFaltanteRepuestos(var faltantes : tPunFaltantes; var reparado:TReparacion);
var
vecFalt:tPunFaltantes;
i:byte;
begin
	if faltantes <> nil then
	begin
		for i:=1 to MAX_REPUESTOS do
		begin
			vecFalt:=faltantes;
			
			while (vecFalt<>nil) do
			begin
				if vecFalt^.codRepu = reparado.repuestos[i].codigo then
				begin
					vecFalt^.cantidad := vecFalt^.cantidad + reparado.repuestos[i].cantidad;
				end;
				vecFalt:=vecFalt^.sig;
			end;
		end;
	end;
end;

end.

